%!TEX program = xelatex
% 完整编译: xelatex -> biber/bibtex -> xelatex -> xelatex
\documentclass[lang=cn,a4paper,newtx]{elegantpaper}

\title{安全通信第二次作业}
\author{202211022732 \\ 叶宗霖}
%\institute{\href{https://elegantlatex.org/}{Elegant\LaTeX{} 项目组}}

\version{1.0}
\date{\zhdate{2024/05/12}}

% 本文档命令
\usepackage{array}
\newcommand{\ccr}[1]{\makecell{{\color{#1}\rule{1cm}{1cm}}}}
\addbibresource[location=local]{reference.bib} % 参考文献，不要删除

\begin{document}
	
	\maketitle
	
	%\begin{abstract}
	%本文为 \href{https://github.com/ElegantLaTeX/ElegantPaper/}{ElegantPaper} 的说明文档。此模板基于 \LaTeX{} 的 article 类，专为工作论文写作而设计。设计这个模板的初衷是让作者不用关心工作论文的格式，专心写作，从而有更加舒心的写作体验。如果你有其他问题、建议或者报告 bug，可以在 \href{https://github.com/ElegantLaTeX/ElegantPaper/issues}{GitHub::ElegantPaper/issues} 留言。如果你想了解更多 Elegant\LaTeX{} 项目组设计的模板，请访问 \href{https://github.com/ElegantLaTeX/}{GitHub::ElegantLaTeX}。
	%\keywords{Elegant\LaTeX{}，工作论文，模板}
	%\end{abstract}
	
	\section{实验内容}
	
	参照RFC8446中TSL1.3的规定，实现用户与服务器间的认证过程。
	
	\section{实验人员}
	叶宗霖 202211022732 代码编写和测试
	
	\section{实验原理}
	
	认证过程如下图
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.6\textwidth]{pic1.png}
		\caption{认证握手}
		\label{fig:1}
	\end{figure}
	
	主要包含Client\_hello、Server\_hello、CertificateRequest、Change\_Cipher\_Spec、Certificate、Key\_Share、Finish等包,其作用如下
	\begin{enumerate}
		\item \textbf{ClientHello}：\\
		- 客户端发送给服务器的第一个消息，用于启动TLS握手过程。\\
		- 它包含了客户端支持的TLS版本、加密套件列表、随机数以及可能的其他会话参数
		
		\item \textbf{ServerHello}：\\
		- 服务器响应客户端的消息，确认TLS的版本和加密套件。\\
		- 它也包含了服务器选择的随机数
		
		\item \textbf{Certificate}：
		- 服务器发送其证书给客户端，证书通常包含了公钥和身份信息。\\
		- 客户端可以使用这个证书来验证服务器的身份，并且使用公钥加密信息
		
		\item \textbf{ServerKeyExchange}（如果需要）：\\
		- 如果使用的密钥交换算法需要额外的信息，服务器会发送这个包
		- 例如，在匿名或PSK（预共享密钥）密钥交换中会用到。
		
		\item \textbf{CertificateRequest}（如果需要）：\\
		- 如果服务器需要客户端提供证书，会发送这个请求。
		
		\item \textbf{ServerHelloDone}：\\
		- 服务器完成其握手阶段的消息发送后，会发送这个包来告知客户端可以开始发送其证书（如果需要）。
		
		\item \textbf{ClientCertificate}（如果需要）：\\
		- 客户端响应服务器的请求，发送其证书。
		
		\item \textbf{ClientKeyExchange}：\\
		- 客户端发送加密的密钥交换信息给服务器，用于生成共享密钥。
		
		\item \textbf{CertificateVerify}（如果需要）：\\
		- 客户端发送这个包来证明它拥有其证书中公钥对应的私钥。
		
		\item \textbf{ChangeCipherSpec}：\\
		- 客户端和服务器都会发送这个包来指示后续通信将使用协商的密钥和加密参数。
		
		\item \textbf{Finished}：\\
		- 客户端和服务器各自发送一个Finished消息，包含之前握手消息的加密散列值。\\
		- 这个散列值用于验证握手过程中没有被篡改，并且双方都拥有正确的共享密钥。
		
		\item \textbf{ApplicationData}：\\
		- 握手完成后，双方可以开始发送应用数据，这些数据将使用协商的加密参数进行加密。
	\end{enumerate}
	
	\subsection{ClientHello}
	ClientHello 消息由以下字段组成：
	
	\begin{itemize}
		\item \textbf{Protocol Version}：
		- 客户端支持的最高TLS版本。
		
		\item \textbf{Random (client\_random)}：
		- 一个随机数，用于生成握手过程中的密钥。
		
		\item \textbf{Session ID}（可选）：
		- 如果客户端希望重用之前的会话，可以发送一个会话ID。
		
		\item \textbf{Cipher Suites}：
		- 客户端支持的加密套件列表，每个套件都定义了一种密钥交换算法、一个加密算法和一个消息认证码算法。
		
		\item \textbf{Compression Methods}：
		- 客户端支持的数据压缩方法列表。
		
		\item \textbf{Extensions}（可选）：
		- 用于提供额外信息和扩展TLS功能的一系列扩展字段。
	\end{itemize}
	
	\subsection{ServerHello}
	ServerHello消息由以下字段组成：
	
	\begin{itemize}
		\item \textbf{Protocol Version}：
		- 服务器选择的TLS版本，通常是客户端和服务器支持的版本中的最低版本。
		
		\item \textbf{Random (server\_random)}：
		- 服务器生成的随机数，与客户端提供的随机数结合使用，以生成后续通信中的密钥。
		
		\item \textbf{Session ID}：
		- 如果服务器同意会话重用，将回传客户端提供的会话ID；否则，服务器可以生成一个新的会话ID。
		
		\item \textbf{Cipher Suite}：
		- 服务器选择的加密套件，基于客户端提供的列表和服务器的能力。
		
		\item \textbf{Compression Method}：
		- 服务器选择的数据压缩方法，必须是客户端支持的列表中的一个。
		
		\item \textbf{Extensions}（可选）：
		- 服务器可以利用扩展字段提供额外的信息或协商TLS的附加功能。
	\end{itemize}
	
	\subsection{Certificate}
	Certificate消息由以下字段组成：
	
	\begin{itemize}
	\item \textbf{Certificate Type}（在TLS 1.3中）：
	- 指示随后证书数据的类型，例如X.509。
	
	\item \textbf{Certificates}：
	- 一个或多个证书组成的列表，通常包括服务器的公钥证书和可能的中间CA证书，形成一个证书链。
	- 这些证书允许客户端验证服务器的身份，并且使用服务器的公钥加密信息。
	
	\item \textbf{Certificate Data}：
	- 每个证书的编码数据，通常使用ASN.1 DER编码格式。
	
	\item \textbf{Extensions}（在TLS 1.3中）：
	- 包含证书相关的额外信息，如证书策略、证书颁发者等。
	\end{itemize}
	
	\subsection{ServerKeyExchange}
	ServerKeyExchange消息由以下字段组成：
	
	\begin{itemize}
	\item \textbf{Key Exchange Algorithm}：
	- 服务器选择的密钥交换算法，用于后续的密钥生成过程。
	
	\item \textbf{Server Params}：
	- 服务器提供的参数，这些参数依赖于密钥交换算法，可能包括：
	\begin{itemize}
		\item 服务器的公钥（在匿名交换算法中）。
		\item Diffie-Hellman参数（如：质数\( p \) 和基数\( g \)）。
		\item 服务器的Diffie-Hellman公钥。
	\end{itemize}
	
	\item \textbf{Signature}（如果使用数字签名）：\\
	- 服务器对前面信息的签名，使用其私钥进行。 \\
	- 签名证明了消息的来源和完整性，允许客户端验证服务器的身份。
	
	\item \textbf{Extensions}（在TLS 1.3中）：
	- 可选字段，用于提供与密钥交换相关的额外信息。
	\end{itemize}
	
	\subsection{CertificateRequest}
	CertificateRequest消息由以下字段组成：
	
	\begin{itemize}
	\item \textbf{Certificate Types}（在TLS 1.3中）：
	- 服务器期望客户端提供的证书类型列表，例如，表示客户端是否需要提供密钥交换所需的证书。
	
	\item \textbf{Signature Algorithms}：
	- 服务器支持的用于验证客户端证书签名的算法列表。
	
	\item \textbf{Certificate Authorities (CAs)}：
	- 一个或多个受信任的证书颁发机构（CA）的标识符列表，客户端应选择列表中的一个CA签发的证书。
	
	\item \textbf{Distinguished Names (DNs)}（可选）：
	- 服务器可以提供一组特定的X.500区别名，作为客户端证书的可选参考。
	
	\item \textbf{Extensions}（在TLS 1.3中）：
	- 包含额外的请求信息或指示，如请求证书的特定属性或策略。
	\end{itemize}
	\subsection{ClientCertificate}
	ClientCertificate 消息由客户端发送，包含以下字段：
	
	\begin{itemize}
		\item \textbf{Certificate}：
		- 客户端的公钥证书，用于服务器验证客户端的身份。
		
		\item \textbf{Certificate Verify}（如果使用数字签名）：
		- 客户端对其证书中公钥的签名，证明客户端拥有相应的私钥。
	\end{itemize}
	
	\subsection{ClientKeyExchange}
	ClientKeyExchange 消息由客户端发送，包含以下字段：
	
	\begin{itemize}
		\item \textbf{Key Exchange Data}：\\
		- 客户端生成的密钥交换数据，用于生成共享密钥。\\
		- 具体内容依赖于使用的密钥交换算法。
	\end{itemize}
	
	\subsection{ChangeCipherSpec}
	ChangeCipherSpec 消息由客户端和服务器发送，包含以下字段：
	
	\begin{itemize}
		\item \textbf{Change Cipher Spec}：
		- 指示接下来的通信将使用之前握手阶段协商的密钥和加密参数。
	\end{itemize}
	
	\subsection{Finished}
	Finished 消息由客户端和服务器发送，包含以下字段：
	
	\begin{itemize}
		\item \textbf{Verify Data}：
		- 包含之前握手消息的加密散列值，用于验证握手的完整性和保密性。
	\end{itemize}
	
	\subsection{Application Data}
	在握手完成后，双方开始发送Application Data：
	
	\begin{itemize}
		\item \textbf{Data}：
		- 加密的应用层数据，使用握手阶段协商的密钥和加密参数进行加密。
	\end{itemize}
	\section{实验步骤}
	实验程序包含两个C++程序，TestTLS13C和TestTLS13C，分别为实验的客户端和服务器端。其依赖于Boost库实现网络首发以及Botan库实现证书解析和AES加密解密。其CMake脚本如下	\begin{lstlisting}
		cmake_minimum_required(VERSION 3.0.0)
		project(TestTLS13 VERSION 0.1.0 LANGUAGES C CXX)
		
		set(CMAKE_CXX_FLAGS "-std=c++20")
		
		include_directories("/usr/include/botan-3")
		include_directories("/usr/include/boost")
		include_directories("Common/inc")
		link_directories("/usr/lib")
		
		add_executable(TestTLS13C Client/main.cpp)
		target_sources(TestTLS13C PUBLIC Common/src/tls.cpp)
		add_executable(TestTLS13S Server/main.cpp)
		target_sources(TestTLS13S PUBLIC Common/src/tls.cpp)
		
		target_link_libraries(TestTLS13C libbotan-3.so)
		target_link_libraries(TestTLS13S libbotan-3.so)
	\end{lstlisting}
	编译完成后，实验可以由代码中的run.sh脚本执行，其内容如下
	\begin{lstlisting}
		#!/bin/sh
		root=$(cd `dirname $0`; pwd)
		
		cd $root/Server
		date > time.txt
		sleep 1
		openssl genrsa -out ca.key -rand time.txt
		openssl pkcs8 -topk8 -inform PEM -in ca.key -outform pem -nocrypt -out pkcs8.pem
		openssl req -out ca.crt -key ca.key -x509 -days 365 -subj "/C=CN/ST=FAKE/L=FAKE/O=FAKE/CN=FAKE/emailAddress=FAKE@FAKE.Server"
		
		cd ../Client
		date > time.txt
		openssl genrsa -out ca.key -rand time.txt
		openssl req -out ca.crt -key ca.key -x509 -days 365 -subj "/C=CN/ST=FAKE/L=FAKE/O=FAKE/CN=FAKE/emailAddress=FAKE@FAKE.Client"
		cd ../
		./build/TestTLS13S > server.log &
		sleep 1
		./build/TestTLS13C > client.log
		sleep 2
	\end{lstlisting}
	其首先通过openssl生成客户端和服务器端的自签名证书。而后运行TestTLS13C和TestTLS13C，并将其结果写入到server.log和client.log
	
	首先Server打开TCP端口，Client连接到该端口，客户端发送一个ClientHello消息给服务器，该消息包含客户端支持的TLS版本、加密套件列表、用于生成共享密钥的随机数。服务器响应一个ServerHello消息，选择一个客户端也支持的TLS版本和加密套件，并提供服务器的随机数。服务器发送其证书给客户端，证书中包含了服务器的公钥，同时发送CertificateRequest请求客户端的证书。而后客户端获取证书中的公钥并客户端响应服务器的请求，发送其证书。客户端发送ClientKeyExchange消息，包含基于服务器提供的公钥生成的共享密钥信息。而后客户端和服务器各自发送一个ChangeCipherSpec消息，指示后续通信将使用协商的密钥和加密参数。握手完成后，客户端读取待发送的文本(Client/payload.txt)通过AES128加密后发送到服务器，服务器通过协商的密钥解密该消息，而后把文本显示出来。
	
	\section{实验结果}
	\subsection{Client}
	Client端的log如下所示,其在开头首先和服务器完成握手，在log中打印服务器的证书，以及读取待发送的文字。
	\begin{lstlisting}
Client open socket
Client send client hello
Client get server hello
Client get certificate
Version: 3
Subject: C="CN",X520.State="FAKE",X520.Locality="FAKE",O="FAKE",CN="FAKE",PKCS9.EmailAddress="FAKE@FAKE.Server"
Issuer: C="CN",X520.State="FAKE",X520.Locality="FAKE",O="FAKE",CN="FAKE",PKCS9.EmailAddress="FAKE@FAKE.Server"
Issued: 2024/05/12 08:14:59 UTC
Expires: 2025/05/12 08:14:59 UTC
Constraints:
None
Signature algorithm: RSA/EMSA3(SHA-256)
Serial number: 9087B160512E721AFDE2B0E2A9312D81CCE513
Authority keyid: 7F647AE973985A8866B06E0547287BAAE13A96D7
Subject keyid: 7F647AE973985A8866B06E0547287BAAE13A96D7
Public Key [RSA-2048]

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3pDpqHkrDmOYVfoAsXdu
2TEf827iupsOrK+W+fzM5MEL3Dg9uko4ULvk9WC9SYWkoqiWwqGOMTjY197D2BdN
4FD8ZzKFYkJgKYDvJ4Y1U0r0ldPX4eyUKnUp8nRWDrD/98/dUGn2DrGGHvvs9OJ5
xnMYCmEa8IZ49iabqcFzn1LJ2ixDveifm6eIlts3A3KjJKnJkzA/qLFnV/QMfnaa
sARlGNdCNzjYtmEMX57abPg6YXZgqzdh52FxVDuJvC/I/Vcg4xgdmZb0KU2YPnYF
ls1+4dc0sQj/NrRj/58PtLwi74m4tocM5dDt13NLAfTmoDuMTyYUwagQfS0mE6jB
swIDAQAB
-----END PUBLIC KEY-----
Client send certificate
Client send keyshare
2023年1月，集成电路科学与工程学院（示范性微电子学院）成立。其前身可以追溯到1956年成立的无线电零件系，毛钧业教授担任第一任系主任，1986年成立微电子研究所，2015年获批建设国家示范性微电子学院。
学院现有在编教职工180余人，其中专任教师154人，教授（含其他正高级）74人。学院设有微电子科学与工程、集成电路设计与集成系统2个本科专业，全部入选国家级一流本科专业建设点，其中集成电路设计与集成系统入选教育部“卓越工程师教育培养计划”。在读本科生1600余人，本科生深造率长期保持在73%以上。
学院设有“集成电路科学与工程”一级学科博士和硕士学位授权点，也是2021年全国首批获批“集成电路科学与工程”一级学科博士学位授权点的18所高校之一。学院研究方向完整涵盖微纳电子材料与器件、功率半导体与集成技术、集成电路设计与设计自动化、封装与微系统集成四个学科方向，在读研究生1300余人。
学院拥有电子薄膜与集成器件全国重点实验室、国家集成电路产教融合创新平台、四川省集成电路产教融合创新平台、四川省功率半导体技术中心、四川省集成电路实验教学中心等教学科研平台。学院形成了从材料、器件、设计、工艺、封测到微系统较完善的科研体系，在功率电子、集成薄膜方向国际领先，优势明显。承担的科研任务来自国家科技部、国家自然科学基金委、教育部、工信部等部委和地方企事业单位，任务涵盖了国家重点研发计划、国家自然科学基金、GF预研、173、基础科研等类型，形成了以“军事电子”、“基础研究”和“产学研合作”三足鼎立的科研格局。
Client send payload
	\end{lstlisting}
	\subsection{Server}
	Server端的log如下所示,其在开头首先和服务器完成握手，在log中打印客户端的证书，和客户端协商密钥，以及读取客户端发送的AES加密后的数据，解密后显示出来。
	\begin{lstlisting}
Server open socket
Server get client hello
Server send server hello
Server send certificate
Server get certificate
Version: 3
Subject: C="CN",X520.State="FAKE",X520.Locality="FAKE",O="FAKE",CN="FAKE",PKCS9.EmailAddress="FAKE@FAKE.Client"
Issuer: C="CN",X520.State="FAKE",X520.Locality="FAKE",O="FAKE",CN="FAKE",PKCS9.EmailAddress="FAKE@FAKE.Client"
Issued: 2024/05/12 08:14:59 UTC
Expires: 2025/05/12 08:14:59 UTC
Constraints:
None
Signature algorithm: RSA/EMSA3(SHA-256)
Serial number: 2478281C6834532AAAE805DCBE99716C8F769D58
Authority keyid: DEDC301B737EFF46437C8D69FAEA506D821C3851
Subject keyid: DEDC301B737EFF46437C8D69FAEA506D821C3851
Public Key [RSA-2048]

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNN+gd6LCXBwAaRr44ZS
4mP+4FbCfVT4Ebw7KPaeneMnV8FaseVrnDAqLo66c9Q6vsAaDH2hBTCB7TEn3hVp
iG6aJSuvrS5EPNCQBH7IgFOy48/PjtT3cPUfeBnuRtYqjQuydFxs/9ReH4o3sdp7
T0Z4+1a2dhKWIHIoHuTNHnUiZkIGrgPap9nz6DhOPNURyFB3kciNXr295sm40j+q
bEGD1TrX8PJhSoqpuhQBptx6iWKNVOhkPxwhHJ/1d81xsIgQdsjVWBhMVtou0ri3
Wjz0dDLbxav2YPmci6SMCciA0w47B8HgCb84wJz1qKmZTvscuQUEcZ39yeN13g9w
ZQIDAQAB
-----END PUBLIC KEY-----
Server get keyshare
2023年1月，集成电路科学与工程学院（示范性微电子学院）成立。其前身可以追溯到1956年成立的无线电零件系，毛钧业教授担任第一任系主任，1986年成立微电子研究所，2015年获批建设国家示范性微电子学院。
学院现有在编教职工180余人，其中专任教师154人，教授（含其他正高级）74人。学院设有微电子科学与工程、集成电路设计与集成系统2个本科专业，全部入选国家级一流本科专业建设点，其中集成电路设计与集成系统入选教育部“卓越工程师教育培养计划”。在读本科生1600余人，本科生深造率长期保持在73%以上。
学院设有“集成电路科学与工程”一级学科博士和硕士学位授权点，也是2021年全国首批获批“集成电路科学与工程”一级学科博士学位授权点的18所高校之一。学院研究方向完整涵盖微纳电子材料与器件、功率半导体与集成技术、集成电路设计与设计自动化、封装与微系统集成四个学科方向，在读研究生1300余人。
学院拥有电子薄膜与集成器件全国重点实验室、国家集成电路产教融合创新平台、四川省集成电路产教融合创新平台、四川省功率半导体技术中心、四川省集成电路实验教学中心等教学科研平台。学院形成了从材料、器件、设计、工艺、封测到微系统较完善的科研体系，在功率电子、集成薄膜方向国际领先，优势明显。承担的科研任务来自国家科技部、国家自然科学基金委、教育部、工信部等部委和地方企事业单位，任务涵盖了国家重点研发计划、国家自然科学基金、GF预研、173、基础科研等类型，形成了以“军事电子”、“基础研究”和“产学研合作”三足鼎立的科研格局。
	\end{lstlisting}
	
	\section{实验分析}
	\subsection{中间人攻击}
	和证书相关的内容可以保证公钥是由正确的服务器或者客户端发送，从而可以抵抗中间人攻击。同时预共享密钥（PSK）的使用增加了额外的安全层，使得即使攻击者截获了握手消息，没有正确的PSK也无法解密后续通信。
	\subsection{重放攻击}
	TLS为每个记录维护一个序列号，这个序列号保证了消息的顺序，并且用于检测和防止重放攻击。TLS对证书消息和密钥交换过程使用非对称加密，因为每个握手状态都是独特的，因此可以抵御重放攻击。在 TLS中，如果客户端使用的密钥共享方法不被服务器支持，服务器可以发送 HelloRetryRequest 消息，要求客户端重新发送 ClientHello 消息。这个过程有助于防止基于不安全参数的重放攻击
	\appendix
	%\appendixpage
	\addappheadtotoc
	\section{附录}
	代码工程被作为pdf附件打包在报告的pdf中，代码也可以在https://gitee.com/yezoli/security-comm中查阅
\end{document}
